// OpenCL kernel to perform an element-wise addition
__kernel
void express(__global float *Foil, /*input*/
             __global float *Result, /*output*/
             int N,
             int k)
{
    int i = 0;

    // Get global position Y
    int col = get_global_id(1);
    // Get global position X
    int row = get_global_id(0);

    /*Cargo todos los valores de la matriz original en la temporal*/
    Result[row * N + col] = Foil[row * N + col];

    /*Espero hasta que todos hayan cargado su valor*/
    barrier(CLK_GLOBAL_MEM_FENCE);

    /*k iteraciones*/
    while(i<k){
        /*Si es una fuente de calor no evaluo*/
        if(Foil[row * N + col]==0){
            float tempSum = Result[row * N + col];
            float neighborhood = 5;/*Cada casillero tiene al menos 3 vecinos*/

            /*Se fija si hay un superior*/
            if(row==0){
                neighborhood--;
            }else{
                tempSum += Result[(row - 1) * N + col];
            }

            /*Se fija si hay un inferior*/
            if(row==N){
                neighborhood--;
            }else{
                tempSum += Result[(row + 1) * N + col];
            }

            /*Se fija si hay un vecino a la izquierda*/
            if(col==0){
                neighborhood--;
            }else{
                tempSum += Result[row * N + col - 1];
            }

            /*Se fija si hay un vecino a la derecha*/
            if(col==N){
                neighborhood--;
            }else{
                tempSum += Result[row * N + col + 1];
            }

            tempResult = tempSum/neighborhood;

            Result[row * N + col] = tempResult;
        }
        /*Espero a todos los procesos terminen el i-esimo paso*/
        barrier(CLK_GLOBAL_MEM_FENCE);

        i++;
    }

    Result[0]=111.11;

}